package br.com.citta.business.service.impl;

import br.com.citta.business.entities.PlanoDespesa;
import br.com.citta.business.entities.wrapper.PlanoDespesaWrapper;
import br.com.citta.business.service.PlanoDespesaService;
import br.com.citta.dao.PlanoDespesaDao;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class PlanoDespesaServiceImpl implements PlanoDespesaService{
    
    PlanoDespesaDao planoDespesaDao;

    public void setPlanoDespesaDao(PlanoDespesaDao planoDespesaDao) {
        this.planoDespesaDao = planoDespesaDao;
    }
    
    private List<PlanoDespesaWrapper> processaDados(List<PlanoDespesa> lista, Integer mes, boolean agrupar){
        List<PlanoDespesaWrapper> result = new ArrayList<>();
        
        for (PlanoDespesa p : lista){
            PlanoDespesaWrapper w = null;
            if (result.size() > 0){
                for (PlanoDespesaWrapper f : result){
                    if (f.getCodigo().equals(p.getId().getCodigo()) || (
                            f.getNome().equals(p.getNome()) && agrupar)){
                        w = f;
                        w.setOrcado(w.getOrcado()+p.getOrcado());
                        w.setAtu(w.getAtu()+p.getAtu01());
                        w.setEmp(w.getEmp()+p.getEmp01());
                        w.setLiq(w.getLiq()+p.getLiq01());
                        w.setPag(w.getPag()+p.getPag01());
                        break;
                    }
                }
            }
            
            if (w == null){
                w = new PlanoDespesaWrapper();

                String reduzido = p.getId().getCodigo();
                reduzido = p.getNivel() == 7 ? reduzido.substring(reduzido.lastIndexOf(".")+1, reduzido.length()) : 
                        p.getTipoConta().equals("A") && agrupar ? reduzido.substring(22, 36) : 
                        p.getTipoConta().equals("A") && !agrupar? reduzido.substring(5,21) : reduzido;
                w.setNome(p.getNome());
                w.setReduzido(reduzido);
                w.setCodigo(p.getId().getCodigo());
                w.setOrcado(p.getOrcado());
                w.setAtu(p.getOrcado()+p.getAtu01());
                w.setEmp(p.getEmp01());
                w.setLiq(p.getLiq01());
                w.setPag(p.getPag01());
                result.add(w);
            }
                        
            if (mes > 1){
                w.setAtu(w.getAtu()+p.getAtu02());
                w.setEmp(w.getEmp()+p.getEmp02());
                w.setLiq(w.getLiq()+p.getLiq02());
                w.setPag(w.getPag()+p.getPag02());
            }
            
            if (mes > 2){
                w.setAtu(w.getAtu()+p.getAtu03());
                w.setEmp(w.getEmp()+p.getEmp03());
                w.setLiq(w.getLiq()+p.getLiq03());
                w.setPag(w.getPag()+p.getPag03());
            }

            if (mes > 3){
                w.setAtu(w.getAtu()+p.getAtu04());
                w.setEmp(w.getEmp()+p.getEmp04());
                w.setLiq(w.getLiq()+p.getLiq04());
                w.setPag(w.getPag()+p.getPag04());
            }

            if (mes > 4){
                w.setAtu(w.getAtu()+p.getAtu05());
                w.setEmp(w.getEmp()+p.getEmp05());
                w.setLiq(w.getLiq()+p.getLiq05());
                w.setPag(w.getPag()+p.getPag05());
            }

            if (mes > 5){
                w.setAtu(w.getAtu()+p.getAtu06());
                w.setEmp(w.getEmp()+p.getEmp06());
                w.setLiq(w.getLiq()+p.getLiq06());
                w.setPag(w.getPag()+p.getPag06());
            }

            if (mes > 6){
                w.setAtu(w.getAtu()+p.getAtu07());
                w.setEmp(w.getEmp()+p.getEmp07());
                w.setLiq(w.getLiq()+p.getLiq07());
                w.setPag(w.getPag()+p.getPag07());
            }

            if (mes > 7){
                w.setAtu(w.getAtu()+p.getAtu08());
                w.setEmp(w.getEmp()+p.getEmp08());
                w.setLiq(w.getLiq()+p.getLiq08());
                w.setPag(w.getPag()+p.getPag08());
            }

            if (mes > 8){
                w.setAtu(w.getAtu()+p.getAtu09());
                w.setEmp(w.getEmp()+p.getEmp09());
                w.setLiq(w.getLiq()+p.getLiq09());
                w.setPag(w.getPag()+p.getPag09());
            }

            if (mes > 9){
                w.setAtu(w.getAtu()+p.getAtu10());
                w.setEmp(w.getEmp()+p.getEmp10());
                w.setLiq(w.getLiq()+p.getLiq10());
                w.setPag(w.getPag()+p.getPag10());
            }

            if (mes > 10){
                w.setAtu(w.getAtu()+p.getAtu11());
                w.setEmp(w.getEmp()+p.getEmp11());
                w.setLiq(w.getLiq()+p.getLiq11());
                w.setPag(w.getPag()+p.getPag11());
            }

            if (mes > 11){
                w.setAtu(w.getAtu()+p.getAtu12());
                w.setEmp(w.getEmp()+p.getEmp12());
                w.setLiq(w.getLiq()+p.getLiq12());
                w.setPag(w.getPag()+p.getPag12());
            }
            
        }

        /* Ordenação da lista pelo codigo reduzido */
        Collections.sort(result, new Comparator<PlanoDespesaWrapper>(){
            public int compare(PlanoDespesaWrapper p1, PlanoDespesaWrapper p2){
                return p1.getReduzido().compareTo(p2.getReduzido());
            }
        });
        
        return result;
    }
    
    public List<PlanoDespesaWrapper> findUnidades(String anoBase, String codUnidade, Integer mes){
        List<PlanoDespesa> lista = planoDespesaDao.findUnidades(anoBase, codUnidade);
        return processaDados(lista, mes, false);
    }
    
    public List<PlanoDespesaWrapper> findElementosS(String anoBase, String codUnidade, String codigo, Integer mes){
        List<PlanoDespesa> lista = planoDespesaDao.findElementosS(anoBase, codUnidade, codigo);
        return processaDados(lista, mes, true);
    }
    
    public List<PlanoDespesaWrapper> findElementosA(String anoBase, String codUnidade, String codigo, String nome, Integer mes){
        List<PlanoDespesa> lista = planoDespesaDao.findElementosA(anoBase, codUnidade, codigo, nome);
        return processaDados(lista, mes, false);
    }
    
    public List<PlanoDespesaWrapper> findElementos(String anoBase, String codUnidade, String codigo, Integer mes){
        List<PlanoDespesa> lista = planoDespesaDao.findElementos(anoBase, codUnidade, codigo);
        return processaDados(lista, mes, true);
    }
    
    public List<PlanoDespesaWrapper> findElementosAnalitico(String anoBase, String codUnidade, String codigo, String nome, Integer mes){
        List<PlanoDespesa> lista = planoDespesaDao.findElementosAnalitico(anoBase, codUnidade, codigo, nome);
        return processaDados(lista, mes, false);
    }
}
